home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / basic / synth.bas < prev    next >
BASIC Source File  |  1990-08-02  |  5KB  |  181 lines

  1. ega = 1
  2. SCREEN 9
  3. IF ega THEN
  4. COL = 12
  5. COLOR COL
  6.   FOR t = 1 TO 8
  7.   kwd = 32
  8.     LINE (141 + t * kwd, 10)-(139 + t * kwd + kwd, 80), 15, BF
  9.     READ a$, B$
  10.     LOCATE 7, 20 + t * 4: PRINT a$
  11.     LOCATE 5, 20 + t * 4: PRINT B$
  12.   NEXT
  13.   offset = 5
  14.  
  15.   FOR t = 1 TO 6
  16.     IF t <> 3 THEN
  17.       LINE (140 + (kwd / 2) + t * kwd + offset, 10)-(140 + (kwd / 2) + t * kwd + kwd - offset, 50), 0, BF
  18.       READ a$: LOCATE 3, 22 + t * 4: PRINT a$
  19.     END IF
  20.   NEXT
  21.  
  22. END IF
  23.  
  24. DATA C,Z,D,X,E,C,F,V,G,B,A,N,B,M,C,",",S,D,F,H,J
  25.  
  26. LOCATE 20, 25: PRINT CHR$(27); CHR$(26); " to select active modules."
  27. PRINT SPACE$(18); CHR$(24); CHR$(25); " to change value - SHIFT for coarse tuning."
  28. PRINT SPACE$(20); "SPACE BAR toggles sound : Q to quit"
  29.  
  30. CHOICE$(0) = " RANDOM "
  31. CHOICE$(1) = "TRIANGLE"
  32. CHOICE$(2) = "SAWTOOTH"
  33. CHOICE$(3) = " SQUARE "
  34. CHOICE$(4) = "  RAMP  "
  35. CHOICE = 1
  36. X = 8: Y = 13
  37. SEL = 1
  38. SND = 1
  39. COLOR 3
  40. LOCATE 10, 6: PRINT "FREQUENCY"
  41. LOCATE 10, 31: PRINT "MODULATION"
  42. LOCATE 9, 55: PRINT "MODULATION"
  43. LOCATE 10, 56: PRINT "FREQUENCY"
  44. MODL = 0
  45. BASEFREQ = 500
  46. bfq = 500
  47. DURATION = 7
  48. FOR SEL = 1 TO 4: GOSUB SKP: NEXT: SEL = 1: GOSUB SKP
  49. AG:
  50. GOSUB LP
  51. GOTO AG
  52. LP:
  53. IN$ = INKEY$
  54. IF INSTR("ZSXDCVGBHNJM,", IN$) <> 0 AND INL$ = IN$ THEN GOSUB FM: GOTO LP
  55.  
  56. IF IN$ = "" THEN
  57. IF SND THEN GOSUB FM
  58. GOTO LP
  59. END IF
  60. IF IN$ = " " THEN SND = 1 - SND
  61.  
  62. IF INSTR("Qq", IN$) <> 0 THEN END
  63. IF INSTR("Zz", IN$) <> 0 THEN NOTE = 0
  64. IF INSTR("Ss", IN$) <> 0 THEN NOTE = 1
  65. IF INSTR("Xx", IN$) <> 0 THEN NOTE = 2
  66. IF INSTR("dD", IN$) <> 0 THEN NOTE = 3
  67. IF INSTR("Cc", IN$) <> 0 THEN NOTE = 4
  68. IF INSTR("Vv", IN$) <> 0 THEN NOTE = 5
  69. IF INSTR("gG", IN$) <> 0 THEN NOTE = 6
  70. IF INSTR("bB", IN$) <> 0 THEN NOTE = 7
  71. IF INSTR("hH", IN$) <> 0 THEN NOTE = 8
  72. IF INSTR("nN", IN$) <> 0 THEN NOTE = 9
  73. IF INSTR("jJ", IN$) <> 0 THEN NOTE = 10
  74. IF INSTR("mM", IN$) <> 0 THEN NOTE = 11
  75. IF IN$ = "," THEN NOTE = 12
  76. INL$ = IN$
  77. bfq = INT(BASEFREQ * ((2 ^ (1 / 12)) ^ NOTE))
  78.    LOCATE 12, 7: PRINT bfq; "  "
  79.  
  80. IN = ASC(RIGHT$(IN$, 1))
  81. IF IN = 77 AND LEN(IN$) > 1 THEN SEL = SEL + 1
  82. IF IN = 75 AND LEN(IN$) > 1 THEN SEL = SEL - 1
  83. IF SEL < 1 THEN SEL = 4
  84. IF SEL > 4 THEN SEL = 1
  85. 'LOCATE 9,1:PRINT SPACE$(79);
  86.  
  87.  
  88. SKP:
  89. IF SEL = 1 THEN C = 11 ELSE C = 1
  90. LINE (5 * X, 11 * Y + 5)-(15 * X, 13 * Y + 5), C, B
  91. IF SEL = 2 THEN C = 11 ELSE C = 1
  92. LINE (30 * X, 11 * Y + 5)-(40 * X, 13 * Y + 5), C, B
  93. IF SEL = 3 THEN C = 11 ELSE C = 1
  94. LINE (55 * X, 11 * Y + 5)-(65 * X, 13 * Y + 5), C, B
  95. IF SEL = 4 THEN C = 11 ELSE C = 1
  96. LINE (30 * X, 15 * Y + 5)-(40 * X, 17 * Y + 5), C, B
  97.  
  98. IF SEL = 1 THEN
  99. LEAP = 1
  100. IF IN = 56 THEN LEAP = BASEFREQ
  101. IF IN = 50 THEN LEAP = BASEFREQ / 2
  102.    IF IN = 72 OR IN = 56 THEN BASEFREQ = BASEFREQ + LEAP
  103.    IF IN = 80 OR IN = 50 THEN BASEFREQ = BASEFREQ - LEAP
  104.    IF BASEFREQ < 100 THEN BASEFREQ = 100
  105.    IF BASEFREQ > 10000 THEN BASEFREQ = 10000
  106. bfq = INT(BASEFREQ * ((2 ^ (1 / 12)) ^ NOTE))
  107.  
  108.    LOCATE 12, 7: PRINT bfq
  109. END IF
  110.  
  111. IF SEL = 2 THEN
  112. LEAP = 1
  113. IF IN = 56 OR IN = 50 THEN LEAP = 25
  114.    IF IN = 72 OR IN = 56 THEN MODL = MODL + LEAP
  115.    IF IN = 80 OR IN = 50 THEN MODL = MODL - LEAP
  116.    IF MODL < 0 THEN MODL = 0
  117.    LOCATE 12, 33: PRINT MODL
  118. END IF
  119. IF SEL = 3 THEN
  120. LEAP = 1
  121. IF IN = 56 OR IN = 50 THEN LEAP = 25
  122.    IF IN = 72 OR IN = 56 THEN DURATION = DURATION + LEAP
  123.    IF IN = 80 OR IN = 50 THEN DURATION = DURATION - LEAP
  124.    IF DURATION < 1 THEN DURATION = 1
  125.    LOCATE 12, 57: PRINT DURATION
  126. END IF
  127. IF SEL = 4 THEN
  128.  
  129.    IF IN = 72 THEN CHOICE = CHOICE + 1
  130.    IF IN = 80 THEN CHOICE = CHOICE - 1
  131.    IF CHOICE < 0 THEN CHOICE = 4
  132.    IF CHOICE > 4 THEN CHOICE = 0
  133.    LOCATE 16, 32: PRINT CHOICE$(CHOICE)
  134. END IF
  135.  
  136. RETURN
  137. END
  138. FM:
  139. 'MODL   ---   MODULATION FACTOR
  140. 'BASEFREQ --- BASE FREQUENCY
  141. IF CHOICE = 0 THEN mod1 = RND * MODL
  142. 'TRIANGLE
  143. MODLP = MODL / DURATION
  144. IF CHOICE = 1 THEN
  145.    MFT = MFT + MODLP
  146.    IF MFT > MODL THEN MFT = 0
  147.    mod1 = ABS((MODL / 2) - MFT) * 2
  148. END IF
  149. 'SAWTOOTH
  150. IF CHOICE = 2 THEN
  151.    MFT = MFT + MODLP
  152.    IF MFT > MODL THEN MFT = 0
  153.  
  154.    mod1 = MFT
  155. END IF
  156. 'SQUARE
  157. IF CHOICE = 3 THEN
  158.    MFT = MFT + MODLP
  159.    IF MFT > MODL THEN MFT = 0
  160.    mod1 = 0
  161.    IF MFT > MODL / 2 THEN mod1 = MODL
  162. END IF
  163. IF CHOICE = 4 THEN
  164.   MFT = MFT + MODLP
  165.    IF MFT > MODL THEN MFT = 0
  166.    INC = 1: IF MFT > MODL / 2 THEN INC = -1
  167.    mod1 = MODL / 2 + MFT * INC
  168. END IF
  169.  
  170.  
  171.  
  172. SOUND mod1 + bfq, .1
  173. RETURN
  174.  
  175.  
  176. '      IF INVAL=77 THEN        'Right Arrow
  177.  '     IF INVAL=75 THEN        'Left Arrow
  178.   '    IF INVAL=72 THEN        'Up Arrow
  179.    '   IF INVAL=80 THEN        'Down Arrow
  180.  
  181.